﻿
namespace Teal.Compiler {

    /// <summary>
    /// 表示编译错误码。
    /// </summary>
    public enum ErrorCode {

        #region 特殊错误

        /// <summary>
        /// 未知错误。
        /// </summary>
        unknown = -1,

        /// <summary>
        /// 没有错误。
        /// </summary>
        none = 0,

        /// <summary>
        /// 用户自定义的 #todo 警告。
        /// </summary>
        todo,

        /// <summary>
        /// 用户自定义的 #tofix 警告。
        /// </summary>
        tofix,

        /// <summary>
        /// 用户自定义的 #warning 警告。
        /// </summary>
        userDefinedWarning,

        /// <summary>
        /// 用户自定义的 #error 警告。
        /// </summary>
        userDefinedError,

        #endregion

        #region 项目配置错误

        /// <summary>
        /// 找不到输入文件或文件夹。
        /// </summary>
        sourceNotFound,

        /// <summary>
        /// out参数缺少文件名。
        /// </summary>
        expectedOutParam,

        /// <summary>
        /// 非法预处理宏值。
        /// </summary>
        invalidDefineValue,

        /// <summary>
        /// 名称不是合法的宏名。
        /// </summary>
        invalidDefineName,

        /// <summary>
        /// 未指定要编译的源文件。
        /// </summary>
        sourceEmpty,

        #endregion

        #region 词法错误

        /// <summary>
        /// 意外的字符。
        /// </summary>
        unexpectedChar,

        /// <summary>
        /// 多行注释未关闭。
        /// </summary>
        expectedMultiLineCommentEnd,

        /// <summary>
        /// 应输入标识符。
        /// </summary>
        expectedIdentifier,

        /// <summary>
        /// 字符串内联表达式未关闭。
        /// </summary>
        expectedStringLiteralExpressionEnd,

        /// <summary>
        /// 字符串未关闭。
        /// </summary>
        expectedStringLiteralEnd,

        /// <summary>
        /// 应输入十六进制数字。
        /// </summary>
        expectedHexDight,

        /// <summary>
        /// 无效的数字；应输入十六进制数字。
        /// </summary>
        invalidHexNumber,

        /// <summary>
        /// 10 进制整数常量值太大。
        /// </summary>
        decimalNumberTooLarge,

        /// <summary>
        /// 16 进制整数常量值太大。
        /// </summary>
        hexNumberTooLarge,

        #region 预处理指令相关错误

        /// <summary>
        /// 预处理符必须出现在行的最开头。
        /// </summary>
        unexpectedPpDirective,

        /// <summary>
        /// 未知的预处理符指令。
        /// </summary>
        invalidPpDirective,

        /// <summary>
        /// 无效的预处理指令参数。
        /// </summary>
        unexpectedPpDirectiveParams,

        /// <summary>
        /// 预处理表达式中只能使用单行注释。
        /// </summary>
        unexpectedPpDirectiveMutliLineComment,

        #region #if #else #elseif #endif

        /// <summary>
        /// 应输入表达式。
        /// </summary>
        expectedPpDirectiveExpression,

        /// <summary>
        /// 无效预处理器表达式项。
        /// </summary>
        invalidPpDirectiveExpression,

        /// <summary>
        /// 应输入“)”。
        /// </summary>
        expectedPpDirectiveExpressionRParam,

        /// <summary>
        /// 无效的“)”。
        /// </summary>
        unexpectedPpDirectiveExpressionRParam,

        /// <summary>
        /// 缺少操作数。
        /// </summary>
        expectedPpDirectiveExpressionOperand,

        /// <summary>
        /// 应输入 #endif 指令。
        /// </summary>
        expectedEndIfPpDirective,

        /// <summary>
        /// 无效的 #else 指令。
        /// </summary>
        unexpectedElsePpDirective,

        /// <summary>
        /// 无效的 #elseif 指令。
        /// </summary>
        unexpectedElseIfPpDirective,

        /// <summary>
        /// 无效的 #endif 指令。
        /// </summary>
        unexpectedEndifPpDirective,

        #endregion

        #region #sub, #endsub, #call

        /// <summary>
        /// 无法在宏内嵌其它宏。
        /// </summary>
        unexpectedSubPpDirective,

        /// <summary>
        /// 当前上下文已经存在同名的宏。
        /// </summary>
        dumpSub,

        /// <summary>
        /// 当前宏已经包含同名的参数。
        /// </summary>
        dumpSubParamName,

        /// <summary>
        /// 应输入宏参数后的“,”。
        /// </summary>
        expectedSubParamComma,

        /// <summary>
        /// 应输入 #endsub 指令。
        /// </summary>
        expectedEndSubDirective,

        /// <summary>
        /// 无效的 #endsub 指令。
        /// </summary>
        unexpectedEndSubDirective,

        /// <summary>
        /// 找不到宏。
        /// </summary>
        subNotFound,

        #endregion

        #region #region, #endregion

        /// <summary>
        /// 应输入 #endregion 指令。
        /// </summary>
        expectedEndRegionPpDirective,

        /// <summary>
        /// 无效的 #endregion 指令。
        /// </summary>
        unexpectedEndRegionPpDirective,

        #endregion

        #region #line

        /// <summary>
        /// 无法在宏内部使用 #line 指令。
        /// </summary>
        unexpectedLinePpDirective,

        /// <summary>
        /// 应输入行号、“default”或“hidden”。
        /// </summary>
        invalidLineDirectiveParam,

        /// <summary>
        /// 指定的行号太大。
        /// </summary>
        invalidLineNumber,

        #endregion

        #endregion

        #endregion

        #region 语法错误

        #region 严格模式

        /// <summary>
        /// 严格模式：应输入“;”。
        /// </summary>
        strictExpectedSemicolon,

        /// <summary>
        /// 严格模式: 应输入“(”。
        /// </summary>
        strictExpectedParentheses,

        #endregion

        #region 错误的标记

        /// <summary>
        /// 应输入“(”。
        /// </summary>
        expectedLParam,

        /// <summary>
        /// 应输入“)”。
        /// </summary>
        expectedRParam,

        /// <summary>
        /// 多余的“)”。
        /// </summary>
        unexpectedRParam,

        /// <summary>
        /// 应输入“]”。
        /// </summary>
        expectedRBrack,

        /// <summary>
        /// 多余的“]”。
        /// </summary>
        unexpectedRBrack,

        /// <summary>
        /// 应输入“{”。
        /// </summary>
        expectedLBrace,

        /// <summary>
        /// 应输入“}”。
        /// </summary>
        expectedRBrace,

        /// <summary>
        /// 多余的“}”。
        /// </summary>
        unexpectedRBrace,

        /// <summary>
        /// 应输入“>”。
        /// </summary>
        expectedGt,

        /// <summary>
        /// 应输入“:”。
        /// </summary>
        expectedColon,

        /// <summary>
        /// 应输入“;”。
        /// </summary>
        expectedSemicolon,

        /// <summary>
        /// 多余的“;”。
        /// </summary>
        unexpectedSemicolon,

        /// <summary>
        /// 应输入“case”或“}”。
        /// </summary>
        expectedCase,

        /// <summary>
        /// 应输入“while”。
        /// </summary>
        expectedWhile,

        /// <summary>
        /// 应输入类型。
        /// </summary>
        expectedType,

        #endregion

        #region 成员定义

        /// <summary>
        /// “import”指令只能在文件顶部使用。
        /// </summary>
        unexpectedImportDirective,

        /// <summary>
        /// 所有语句都应放在函数内。
        /// </summary>
        unexpectedStatement,

        /// <summary>
        /// 不是可重载的操作符。
        /// </summary>
        invalidOperatorOverload,

        /// <summary>
        /// 修饰符重复。
        /// </summary>
        dumpModifiers,

        /// <summary>
        /// 命名空间不允许有注解。
        /// </summary>
        unexpectedAnnotation,

        /// <summary>
        /// 注解太多。
        /// </summary>
        tooManyAnnoatation,

        /// <summary>
        /// 过多的访问修饰符。
        /// </summary>
        tooManyAccessibility,

        /// <summary>
        /// 泛型约束太多。
        /// </summary>
        tooManyGenericConstraints,

        /// <summary>
        /// 泛型参数太多。
        /// </summary>
        tooManyGenericTypeParameters,

        /// <summary>
        /// 参数修饰符太多。
        /// </summary>
        tooManyParameterModifiers,

        /// <summary>
        /// 基类型太多。
        /// </summary>
        tooManyBaseTypes,

        /// <summary>
        /// 含有其它修饰符的参数不允许有默认值。
        /// </summary>
        invalidDefaultParameter,

        /// <summary>
        /// 应输入“this”或“base”。
        /// </summary>
        expectedThisOrBase,

        /// <summary>
        /// 应输入“get”或“set”。
        /// </summary>
        expectedGetOrSet,

        /// <summary>
        /// get 或 set 访问器重复。
        /// </summary>
        dumpGetOrSet,

        /// <summary>
        /// 命名空间不允许有修饰符。
        /// </summary>
        unexpectedModifiers,

        /// <summary>
        /// 修饰符对该项无效。
        /// </summary>
        invalidModifiers,

        /// <summary>
        /// 非法的显式接口声明。
        /// </summary>
        invalidExplicitType,

        #endregion

        #region 语句表达式

        /// <summary>
        /// 应输入语句。
        /// </summary>
        expectedStatement,

        /// <summary>
        /// 嵌套语句不能是变量声明语句。
        /// </summary>
        invalidVariableStatement,

        /// <summary>
        /// 嵌套语句不能是标签语句。
        /// </summary>
        invalidLabeledStatement,

        /// <summary>
        /// 此分号可能是多余的。
        /// </summary>
        confusedSemicolon,

        /// <summary>
        /// “for to”语句中变量缺少初始值。
        /// </summary>
        expectedForToInitialiser,

        /// <summary>
        /// “for to”语句中最多只能有一个变量。
        /// </summary>
        invalidForToInitialiser,

        /// <summary>
        /// “for in”语句中变量不允许有初始值。
        /// </summary>
        unexpectedForInInitialiser,

        /// <summary>
        /// “for in”语句中最多只能有一个变量。
        /// </summary>
        invalidForInInitialiser,

        /// <summary>
        /// 无效的表达式项。
        /// </summary>
        invalidExpression,

        #endregion

        #endregion

        /// <summary>
        /// 接口不能包含字段。
        /// </summary>
        fieldInInterface,

        /// <summary>
        /// 无法扩展字段。
        /// </summary>
        fieldInExtension,
        constCannotStaticOrFinal,
        circuleFieldInitializer,
        expectedInterfaceType,
        explicitTypeNotFound,
        explicitTypeMemberNotFound,
        unepectedIndexer,
        unepectedProperty,
        expectedConstInitialValue,
        unexpectedConstructor,
        unexpectedStaticConstructorArguments,
        expectedStructConstructorArguments,
        unexpectedDeconstructor,
        unexpectedDeconstructorArguments,
        unepectedAbstractOrExtern,
        epectedAbstractOrExtern,

    }
}
